<?php
namespace PsiFramework\Applications\Bibliotheque\Classes\DAO;

import("Classes.DAO.AbstractDAO");
import("Applications.Bibliotheque.Classes.Model.Auteur");

use \PsiFramework\Classes\DAO\AbstractDAO;
use \PsiFramework\Applications\Bibliotheque\Classes\Model\Auteur;

/**
 * Bibliotheque
 * Gestion de ma bibliothèque
 *
 * @author Rémi San
 * @version beta
 */

/**
 * Classe d'accès à un Auteur
 *
 * @package DAO
 */
class AuteurDAO extends AbstractDAO
{

    protected static $_singleton = null;

    /**
     * Retourne l'Auteur correspondant au nom partiel passé
     *
     * @param   string  $partialName  une partie du nom de l'auteur
     * @return  Auteur  L'Auteur correspondant à l'identifiant
     */
    public function retrieveByPartialName(/*string*/ $partialName)
    {

        $colNom = new SqlColumn("auteur_nom");
        $colPrenom = new SqlColumn("auteur_prenom");
        $value = '%' ;    if (!isNullOrEmptyString($partialName)) {
            $value = mb_strtoupper($partialName, 'utf-8') . "%" ;
        }
        $sqlValue = new SqlValue($value);

        $upperOne = new SqlFunction("UPPER");
        $upperOne->addParameter($colNom);
        
        $upperTwo = new SqlFunction("UPPER");
        $upperTwo->addParameter($colPrenom);

        $likeOne = new SqlOperation(SqlOperation::$like);
        $likeOne->addParameter($upperOne);
        $likeOne->addParameter($sqlValue);
        
        $likeTwo = new SqlOperation(SqlOperation::$like);
        $likeTwo->addParameter($upperTwo);
        $likeTwo->addParameter($sqlValue);

        $or = new SqlOperation(SqlOperation::$or);
        $or->addParameter($likeOne);
        $or->addParameter($likeTwo);

        return $this->retrieveAll(new QueryFilter($or));

    }

    /**
     * Function to be called instead of the constructor.
     *
     * @return AuteurDAO instance
     */
    public static function getInstance($objectParameters)
    {

        if (self::$_singleton==null) {
            self::$_singleton = new AuteurDAO($objectParameters);
        }

        return self::$_singleton;
    }
}
